// 使用应用层协议封装的数据处理的方法
#pragma once
#include "cal_protocol.hpp"

enum
{
    Unknow = 1,
    Div_error,
    Mod_error
};


class server_cal
{
private:
    // 这里的cal_helper其实就是表示的应用层协议
    response cal_helper(const request &rq)
    {
        response rs;
        int l = rq._l, r = rq._r;
        switch (rq._op)
        {
        case '+':
            rs._result = l + r;
            break;
        case '-':
            rs._result = l - r;
            break;
        case '*':
            rs._result = l * r;
            break;
        case '/':
            if (!r)
            {
                rs._result = -1;
                rs._exit_code = Div_error;
            }
            else
                rs._result = l / r;
            break;
        case '%':
            if (!r)
            {
                rs._result = -1;
                rs._exit_code = Mod_error;
            }
            else
                rs._result = l % r;
            break;
        default:
            rs._result = -1;
            rs._exit_code = Unknow;
            break;
        }
        return rs;
    }

public:
    // 该部分报文的处理其实就是对应表示层的数据
    // 传入报文，返回结果所对应的报文
    std::string cal_in_server(std::string &mesg)
    {
        // 删除报头
        std::string content;
        if (!decode(mesg, &content))
            return "";
        
        // 反序列化
        request rq;
        if (!rq.deseraliaze(content))
            return "";
        
        // 进行计算，得到相应报文
        response rs = cal_helper(rq);
        // 序列化
        std::string rs_str = rs.seraliaze();
        // 添加报头
        return encode(rs_str);
    }
};